﻿using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Data;
using System.Data.SqlClient;
using Core.DAL;

namespace BAL.eCorp
{
    public class Books
    {
        #region region: Khai báo hằng
        const string CONST_TABLE_NAME = "Book";
        #endregion

        #region region: Khai báo biến
        protected int _bookId;
        protected string _parentId = string.Empty;
        protected string _bookName = string.Empty;
        protected string _bookName_E = string.Empty;
        protected string _title = string.Empty;
        protected string _intro = string.Empty;
        protected string _content = string.Empty;
        protected DateTime _ngayDang;
        protected double _soLuong1 = 0;
        protected double _soLuong2 = 0;
        protected int? _nxbId = null;
        protected string _nxbName = string.Empty;
        protected int? _cateId = null;
        protected string _cateName = string.Empty;
        protected int? _authorId = null;
        protected string _authorName = string.Empty;
        protected int? _authorId2 = null;
        protected string _authorName2 = string.Empty;
        protected int? _authorId3 = null;
        protected string _authorName3 = string.Empty;
        protected int? _nguoiDich = null;
        protected string _ten_N_Dich = string.Empty;
        protected int? _nguoiDich2 = null;
        protected string _ten_N_Dich2 = string.Empty;
        protected int? _nguoiDich3 = null;
        protected string _ten_N_Dich3 = string.Empty;
        protected string _imageUrl = string.Empty;
        protected string _imageUrl2 = string.Empty;
        protected string _imageUrl3 = string.Empty;
        protected int _danhGia = 0;
        protected double _gia2 = 0;
        protected double _tien2 = 0;
        protected double _ptCk = 0;
        protected string _description = string.Empty;
      
        // Hệ thống
        protected DateTime _createDate ;
        protected string _createUser = string.Empty;
        protected DateTime _editDate ;
        protected string _editUser = string.Empty;
        #endregion

        #region region: Định nghĩa thuộc tính
        /// <summary>
        /// Mả sách
        /// </summary>
        public int BookID
        {
            get { return _bookId; }
            set { _bookId = value; }
        }
        /// <summary>
        /// Mả bộ
        /// </summary>
        public string ParentID
        {
            get { return _parentId; }
            set { _parentId = value; }
        }
        
        /// <summary>
        /// Tên sách
        /// </summary>
        public string BookName
        {
            get { return _bookName; }
            set { _bookName = value; }
        }
        /// <summary>
        /// Tên sách
        /// </summary>
        public string BookName_E
        {
            get { return _bookName_E; }
            set { _bookName_E = value; }
        }
        /// <summary>
        /// Tiêu đề
        /// </summary>
        public string Title
        {
            get { return _title; }
            set { _title = value; }
        }
        /// <summary>
        /// Giới thiệu sách
        /// </summary>
        public string Intro
        {
            get { return _intro; }
            set { _intro = value; }
        }
        /// <summary>
        /// Nội dung sách
        /// </summary>
        public string Content
        {
            get { return _content; }
            set { _content = value; }
        }
        /// <summary>
        /// Ngày đăng
        /// </summary>
        public DateTime NgayDang
        {
            get { return _ngayDang; }
            set { _ngayDang = value; }
        }
        /// <summary>
        /// Số lượng nhập
        /// </summary>
        public double SoLuong1
        {
            get { return _soLuong1; }
            set { _soLuong1 = value; }
        }
        /// <summary>
        /// Số lượng xuất
        /// </summary>
        public double SoLuong2
        {
            get { return _soLuong2; }
            set { _soLuong2 = value; }
        }
        /// <summary>
        /// Mả nhà xuất bản
        /// </summary>
        public int? NxbID
        {
            get { return _nxbId; }
            set { _nxbId = value; }
        }
        /// <summary>
        /// Tên nhà xuất bản
        /// </summary>
        public string NxbName
        {
            get { return _nxbName; }
            set { _nxbName = value; }
        }
        /// <summary>
        /// Mã thể loại
        /// </summary>
        public int? CateID
        {
            get { return _cateId; }
            set { _cateId = value; }
        }
        /// <summary>
        /// Tên thể loại
        /// </summary>
        public string CateName
        {
            get { return _cateName; }
            set { _cateName = value; }
        }
        /// <summary>
        /// Mã tác giả
        /// </summary>
        public int? AuthorId
        {
            get { return _authorId; }
            set { _authorId = value; }
        }
        /// <summary>
        /// Tên tác giả
        /// </summary>
        public string AuthorName
        {
            get { return _authorName; }
            set { _authorName = value; }
        }
        /// <summary>
        /// Mã tác giả
        /// </summary>
        public int? AuthorId2
        {
            get { return _authorId2; }
            set { _authorId2 = value; }
        }
        /// <summary>
        /// Tên tác giả
        /// </summary>
        public string AuthorName2
        {
            get { return _authorName2; }
            set { _authorName2 = value; }
        }
        /// <summary>
        /// Mã tác giả
        /// </summary>
        public int? AuthorId3
        {
            get { return _authorId3; }
            set { _authorId3 = value; }
        }
        /// <summary>
        /// Tên tác giả
        /// </summary>
        public string AuthorName3
        {
            get { return _authorName3; }
            set { _authorName3 = value; }
        }
        /// <summary>
        /// Mã người dịch
        /// </summary>
        public int? NguoiDich
        {
            get { return _nguoiDich; }
            set { _nguoiDich = value; }
        }
        /// <summary>
        /// Tên người dịch
        /// </summary>
        public string Ten_N_Dich
        {
            get { return _ten_N_Dich; }
            set { _ten_N_Dich = value; }
        }
        /// <summary>
        /// Mã người dịch 2
        /// </summary>
        public int? NguoiDich2
        {
            get { return _nguoiDich2; }
            set { _nguoiDich2 = value; }
        }
        /// <summary>
        /// Tên người dịch 2
        /// </summary>
        public string Ten_N_Dich2
        {
            get { return _ten_N_Dich2; }
            set { _ten_N_Dich2 = value; }
        }
        /// <summary>
        /// Mã người dịch 3
        /// </summary>
        public int? NguoiDich3
        {
            get { return _nguoiDich3; }
            set { _nguoiDich3 = value; }
        }
        /// <summary>
        /// Tên người dịch 3
        /// </summary>
        public string Ten_N_Dich3
        {
            get { return _ten_N_Dich3; }
            set { _ten_N_Dich3 = value; }
        }
        /// <summary>
        /// Hình ảnh
        /// </summary>
        public string ImageUrl
        {
            get { return _imageUrl; }
            set { _imageUrl = value; }
        }
        /// <summary>
        /// Hình ảnh 2
        /// </summary>
        public string ImageUrl2
        {
            get { return _imageUrl2; }
            set { _imageUrl2 = value; }
        }
        /// <summary>
        /// Hình ảnh 3
        /// </summary>
        public string ImageUrl3
        {
            get { return _imageUrl3; }
            set { _imageUrl3 = value; }
        }
        /// <summary>
        /// Điểm đánh giá
        /// </summary>
        public int DanhGia
        {
            get { return _danhGia; }
            set { _danhGia = value; }
        }
        /// <summary>
        /// Giá niêm yết
        /// </summary>
        public double Gia2
        {
            get { return _gia2; }
            set { _gia2 = value; }
        }
        /// <summary>
        /// Thành tiền
        /// </summary>
        public double Tien2
        {
            get { return _tien2; }
            set { _tien2 = value; }
        }
        /// <summary>
        /// Phần trăm chiết khấu, giảm giá
        /// </summary>
        public double PtCk
        {
            get { return _ptCk; }
            set { _ptCk = value; }
        }
        /// <summary>
        /// Diễn giải
        /// </summary>
        public string Description
        {
            get { return _description; }
            set { _description = value; }
        }
        /// <summary>
        /// Ngày tạo
        /// </summary>
        public DateTime CreateDate
        {
            get { return _createDate; }
            set { _createDate = value; }
        }
        /// <summary>
        /// Người tạo
        /// </summary>
        public string CreateUser
        {
            get { return _createUser; }
            set { _createUser = value; }
        }
        /// <summary>
        /// Ngày tạo
        /// </summary>
        public DateTime EditDate
        {
            get { return _editDate; }
            set { _editDate = value; }
        }
        /// <summary>
        /// Người tạo
        /// </summary>
        public string EditUser
        {
            get { return _editUser; }
            set { _editUser = value; }
        }
        #endregion

        #region region: Định nghĩa phương thức
        /// <summary>
        /// 
        /// </summary>
        public Books()
        {
        }
        /// <summary>
        /// 
        /// </summary>
        /// <param name="reader"></param>
        public Books(SqlDataReader reader)
        {
            if (reader != null && !reader.IsClosed)
            {
                _bookId = reader.GetInt32(reader.GetOrdinal("BookID"));
                _parentId = reader.GetString(reader.GetOrdinal("ParentID"));
                _bookName = reader.GetString(reader.GetOrdinal("BookName"));
                _bookName_E = reader.GetString(reader.GetOrdinal("BookName_E"));
                _title = reader.GetString(reader.GetOrdinal("Title"));
                _intro = reader.GetString(reader.GetOrdinal("Intro"));
                _content = reader.GetString(reader.GetOrdinal("Content"));
                if (!reader.IsDBNull(reader.GetOrdinal("NgayDang")))
                    _ngayDang = reader.GetDateTime(reader.GetOrdinal("NgayDang"));
                _soLuong1 = reader.GetDouble(reader.GetOrdinal("SoLuong1"));
                _soLuong2 = reader.GetDouble(reader.GetOrdinal("SoLuong2"));
                _nxbId = reader.GetInt32(reader.GetOrdinal("NxbId"));
                _nxbName = reader.GetString(reader.GetOrdinal("NxbName"));
                _cateId = reader.GetInt32(reader.GetOrdinal("CateID"));
                _cateName = reader.GetString(reader.GetOrdinal("CateName"));
                _authorId = reader.GetInt32(reader.GetOrdinal("AuthorID"));
                _authorName = reader.GetString(reader.GetOrdinal("AuthorName"));
                _authorId2 = reader.GetInt32(reader.GetOrdinal("AuthorID2"));
                _authorName2 = reader.GetString(reader.GetOrdinal("AuthorName2"));
                _authorId3 = reader.GetInt32(reader.GetOrdinal("AuthorID3"));
                _authorName3 = reader.GetString(reader.GetOrdinal("AuthorName3"));
                _nguoiDich = reader.GetInt32(reader.GetOrdinal("NguoiDich"));
                _ten_N_Dich = reader.GetString(reader.GetOrdinal("Ten_N_Dich"));
                _nguoiDich2 = reader.GetInt32(reader.GetOrdinal("NguoiDich2"));
                _ten_N_Dich2 = reader.GetString(reader.GetOrdinal("Ten_N_Dich2"));
                _nguoiDich3 = reader.GetInt32(reader.GetOrdinal("NguoiDich3"));
                _ten_N_Dich3 = reader.GetString(reader.GetOrdinal("Ten_N_Dich3"));
                _imageUrl = reader.GetString(reader.GetOrdinal("ImageURL"));
                _imageUrl2 = reader.GetString(reader.GetOrdinal("ImageURL2"));
                _imageUrl3 = reader.GetString(reader.GetOrdinal("ImageURL3"));
                _danhGia = reader.GetInt32(reader.GetOrdinal("DanhGia"));
                _gia2 = reader.GetDouble(reader.GetOrdinal("Gia2"));
                _tien2 = reader.GetDouble(reader.GetOrdinal("Tien2"));
                _ptCk = reader.GetDouble(reader.GetOrdinal("PtCk"));
                _description = reader.GetString(reader.GetOrdinal("Description"));
                // Hệ thống
                if (!reader.IsDBNull(reader.GetOrdinal("CreateDate")))
                    _createDate = reader.GetDateTime(reader.GetOrdinal("CreateDate"));
                if (!reader.IsDBNull(reader.GetOrdinal("CreateUser")))
                    _createUser = reader.GetString(reader.GetOrdinal("CreateUser"));
                if (!reader.IsDBNull(reader.GetOrdinal("EditDate")))
                    _editDate = reader.GetDateTime(reader.GetOrdinal("EditDate"));
                if (!reader.IsDBNull(reader.GetOrdinal("EditUser")))
                    _editUser = reader.GetString(reader.GetOrdinal("EditUser"));
            }
        }
        /// <summary>
        /// Phương thức truy xuất sản phẩm theo ProductID
        /// </summary>
        /// <returns></returns>
        public static Books GetByID(Books o)
        {
            DBHelp db = new DBHelp();
            Books obj = new Books();

            db.AddParameter("@BookID", o.BookID);
            SqlDataReader reader = db.ExecuteReader("sp_Book_SelectByID", CommandType.StoredProcedure);
            if (reader.Read())
            {
                obj = new Books(reader);
            }

            reader.Close();
            return obj;
        }
        /// <summary>
        /// Phương thức truy xuất toàn bộ dữ liệu bảng sản phẩm
        /// </summary>
        /// <returns></returns>
        public static IList<Books> GetAll()
        {
            DBHelp db = new DBHelp();
            IList<Books> list = new List<Books>();
            SqlDataReader reader = db.ExecuteReader("sp_Book_SelectAll", CommandType.StoredProcedure);
            while (reader.Read())
            {
                list.Add(new Books(reader));
            }
            reader.Close();
            return list;
        }
        /// <summary>
        /// Truy xuất sản phẩm theo mã thể loại
        /// </summary>
        /// <param name="o"></param>
        /// <returns></returns>
        public static IList<Books> GetByCateID(Books o)
        {
            DBHelp db = new DBHelp();
            IList<Books> list = new List<Books>();
            db.AddParameter("@CateID", o.CateID);
            SqlDataReader reader = db.ExecuteReader("sp_Book_SelectByCateID", CommandType.StoredProcedure);
            while (reader.Read())
            {
                list.Add(new Books(reader));
            }
            reader.Close();
            return list;
        }
        /// <summary>
        /// Truy xuất sản phẩm theo mã thể loại
        /// </summary>
        /// <param name="o"></param>
        /// <returns></returns>
        public static IList<Books> GetByCateIDTop3(Books o)
        {
            DBHelp db = new DBHelp();
            IList<Books> list = new List<Books>();
            db.AddParameter("@CateID", o.CateID);
            SqlDataReader reader = db.ExecuteReader("sp_Book_SelectByCateIDTop3", CommandType.StoredProcedure);
            while (reader.Read())
            {
                list.Add(new Books(reader));
            }
            reader.Close();
            return list;
        }
        /// <summary>
        /// Chèn mới một sản phẩm
        /// </summary>
        /// <param name="o"></param>
        public static void Insert(Books o)
        {
            DBHelp db = new DBHelp();
            db.AddParameter("@ParentID", o.ParentID);
            db.AddParameter("@BookName", o.BookName);
            db.AddParameter("@BookName_E", o.BookName_E);
            db.AddParameter("@Title", o.Title);
            db.AddParameter("@Intro", o.Intro);
            db.AddParameter("@Content", o.Content);
            db.AddParameter("@NgayDang", o.NgayDang);
            db.AddParameter("@SoLuong1", o.SoLuong1);
            db.AddParameter("@SoLuong2", o.SoLuong2);
            db.AddParameter("@NxbID", o.NxbID);
            db.AddParameter("@CateID", o.CateID);
            db.AddParameter("@AuthorId", o.AuthorId);
            db.AddParameter("@AuthorId2", o.AuthorId2);
            db.AddParameter("@AuthorId3", o.AuthorId3);
            db.AddParameter("@NguoiDich", o.NguoiDich);
            db.AddParameter("@NguoiDich2", o.NguoiDich2);
            db.AddParameter("@NguoiDich3", o.NguoiDich3);
            db.AddParameter("@ImageUrl", o.ImageUrl);
            db.AddParameter("@ImageUrl2", o.ImageUrl2);
            db.AddParameter("@ImageUrl3", o.ImageUrl3);
            db.AddParameter("@DanhGia", o.DanhGia);
            db.AddParameter("@Gia2", o.Gia2);
            db.AddParameter("@Tien2", o.Tien2);
            db.AddParameter("@PtCk", o.PtCk);
            db.AddParameter("@Description", o.Description);
            db.AddParameter("@CreateDate", DateTime.Now.ToShortDateString());
            db.AddParameter("@CreateUser", o.CreateUser);
            db.ExecuteNonQuery("sp_Book_Insert", CommandType.StoredProcedure);
        }
        /// <summary>
        /// Cập nhật sản phẩm
        /// </summary>
        /// <param name="o"></param>
        public static void Update(Books o)
        {
            DBHelp db = new DBHelp();
            db.AddParameter("@BookID", o.BookID);
            db.AddParameter("@ParentID", o.ParentID);
            db.AddParameter("@BookName", o.BookName);
            db.AddParameter("@BookName_E", o.BookName_E);
            db.AddParameter("@Title", o.Title);
            db.AddParameter("@Intro", o.Intro);
            db.AddParameter("@Content", o.Content);
            db.AddParameter("@NgayDang", o.NgayDang);
            db.AddParameter("@SoLuong1", o.SoLuong1);
            db.AddParameter("@SoLuong2", o.SoLuong2);
            db.AddParameter("@NxbID", o.NxbID);
            db.AddParameter("@CateID", o.CateID);
            db.AddParameter("@AuthorId", o.AuthorId);
            db.AddParameter("@AuthorId2", o.AuthorId2);
            db.AddParameter("@AuthorId3", o.AuthorId3);
            db.AddParameter("@NguoiDich", o.NguoiDich);
            db.AddParameter("@NguoiDich2", o.NguoiDich2);
            db.AddParameter("@NguoiDich3", o.NguoiDich3);
            db.AddParameter("@ImageUrl", o.ImageUrl);
            db.AddParameter("@ImageUrl2", o.ImageUrl2);
            db.AddParameter("@ImageUrl3", o.ImageUrl3);
            db.AddParameter("@DanhGia", o.DanhGia);
            db.AddParameter("@Gia2", o.Gia2);
            db.AddParameter("@Tien2", o.Tien2);
            db.AddParameter("@PtCk", o.PtCk);
            db.AddParameter("@Description", o.Description);
            db.AddParameter("@EditDate", DateTime.Now.ToShortDateString());
            db.AddParameter("@EditUser", o.EditUser);
            db.ExecuteNonQuery("sp_Book_Update", CommandType.StoredProcedure);
        }
        /// <summary>
        /// Xóa sản phẩm theo thể loại
        /// </summary>
        /// <param name="o"></param>
        public static void Delete(Books o)
        {
            DBHelp db = new DBHelp();
            db.AddParameter("@BookID", o.BookID);
            db.ExecuteNonQuery("sp_Book_Delete", CommandType.StoredProcedure);
        }
        #endregion
    }
}
